/**
 * @p.md
 * 
 * 集群成员列表
 */
import { Member, MemberStatus } from './clusterConfig';
import { EventEmitter } from 'events';

/**
 * 成员事件类型
 */
export enum MemberEventType {
  /**
   * 成员加入事件
   */
  MemberJoined = 'member-joined',
  
  /**
   * 成员离开事件
   */
  MemberLeft = 'member-left',
  
  /**
   * 成员状态变更事件
   */
  MemberStatusChanged = 'member-status-changed'
}

/**
 * 成员事件接口
 */
export interface MemberEvent {
  /**
   * 事件类型
   */
  type: MemberEventType;
  
  /**
   * 相关成员
   */
  member: Member;
  
  /**
   * 旧状态(仅用于状态变更事件)
   */
  oldStatus?: MemberStatus;
  
  /**
   * 事件时间戳
   */
  timestamp: number;
}

/**
 * 集群成员列表类
 * 管理集群中所有成员的状态
 */
export class MemberList extends EventEmitter {
  /**
   * 成员映射表
   */
  private members: Map<string, Member> = new Map();
  
  /**
   * 本节点ID
   */
  private localMemberId: string | null = null;

  /**
   * 构造函数
   */
  constructor() {
    super();
  }

  /**
   * 设置本节点ID
   * @param memberId 成员ID
   */
  setLocalMemberId(memberId: string): void {
    this.localMemberId = memberId;
  }

  /**
   * 获取本节点ID
   */
  getLocalMemberId(): string | null {
    return this.localMemberId;
  }

  /**
   * 获取本节点信息
   */
  getLocalMember(): Member | null {
    if (!this.localMemberId) return null;
    return this.getMember(this.localMemberId);
  }

  /**
   * 添加成员
   * @param member 成员信息
   */
  addMember(member: Member): void {
    const exists = this.members.has(member.id);
    this.members.set(member.id, member);
    
    // 触发事件
    if (!exists) {
      const event: MemberEvent = {
        type: MemberEventType.MemberJoined,
        member,
        timestamp: Date.now()
      };
      this.emit(MemberEventType.MemberJoined, event);
    }
  }

  /**
   * 更新成员状态
   * @param memberId 成员ID
   * @param status 新状态
   */
  updateMemberStatus(memberId: string, status: MemberStatus): boolean {
    const member = this.members.get(memberId);
    if (!member) return false;
    
    const oldStatus = member.status;
    if (oldStatus === status) return true;
    
    // 更新状态
    member.status = status;
    this.members.set(memberId, member);
    
    // 触发状态变更事件
    const event: MemberEvent = {
      type: MemberEventType.MemberStatusChanged,
      member,
      oldStatus,
      timestamp: Date.now()
    };
    this.emit(MemberEventType.MemberStatusChanged, event);
    
    // 如果状态变为离线，触发离开事件
    if (status === MemberStatus.Dead) {
      const leftEvent: MemberEvent = {
        type: MemberEventType.MemberLeft,
        member,
        timestamp: Date.now()
      };
      this.emit(MemberEventType.MemberLeft, leftEvent);
    }
    
    return true;
  }

  /**
   * 移除成员
   * @param memberId 成员ID
   */
  removeMember(memberId: string): boolean {
    const member = this.members.get(memberId);
    if (!member) return false;
    
    this.members.delete(memberId);
    
    // 触发离开事件
    const event: MemberEvent = {
      type: MemberEventType.MemberLeft,
      member,
      timestamp: Date.now()
    };
    this.emit(MemberEventType.MemberLeft, event);
    
    return true;
  }

  /**
   * 获取成员信息
   * @param memberId 成员ID
   */
  getMember(memberId: string): Member | null {
    return this.members.get(memberId) || null;
  }

  /**
   * 获取所有成员
   */
  getAllMembers(): Member[] {
    return Array.from(this.members.values());
  }

  /**
   * 获取所有活跃成员
   */
  getAliveMembers(): Member[] {
    return this.getAllMembers().filter(m => m.status === MemberStatus.Alive);
  }

  /**
   * 获取成员数量
   */
  getMemberCount(): number {
    return this.members.size;
  }

  /**
   * 检查成员是否存在
   * @param memberId 成员ID
   */
  hasMember(memberId: string): boolean {
    return this.members.has(memberId);
  }

  /**
   * 清空成员列表
   */
  clear(): void {
    this.members.clear();
  }
} 